<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>


首先，我们需要知道物体是由多少个多边形构成的。对于立方体来说，这个数字是 6。在我们的简单示例中（由两个三角形构成），这个数字是 2。

然后，我们需要知道物体的每个面由多少个顶点组成。对于立方体，这将是一个包含 6 个整数的数组，其值为以下值 {4, 4, 4, 4, 4, 4}。在我们的三角形示例中，这将是 {3, 3}。请注意，此数组的大小等于网格包含的多边形数量。我们将此数组称为面索引数组。

我们还需要知道每个面在组成该面的顶点数组中每个顶点的索引。对于三角形示例，此数组如下所示：{0, 2, 1, 0, 3, 2}。我们知道第一个面有 3 个顶点。因此，我们只需从该数组中读取前 3 个整数值（值 0、2、1），然后使用它们来索引顶点数组中的以下顶点：{-1,0,0}, {0,1,0}, {1,0,0}, {0,-1,0}}。下一个面也是一个三角形，因此我们从顶点索引数组中读取接下来的 3 个值（值 0、3、2）并使用这些索引从顶点数组中读取顶点位置：{-1,0,0}, {0,1,0}, {1,0,0}, {0,-1,0}}。我们将这个数组称为顶点索引数组。请注意，这个数组的大小等于面索引数组中所有整数值的总和（三角形示例中为 3 + 3，立方体为 6 乘以 4）。

最后，我们需要知道顶点的位置（我们在上面称之为顶点数组）。请注意，立方体的每个面都与其他面（以及边）共享一些顶点。我们将此数组称为顶点数组。

-- 需要知道有多少个多边形，需要知道每个面多少个顶点，需要知道每个组成该面数组中顶点索引， 需要知道顶点数组[{-1,0,0}, {0,1,0}, {1,0,0}, {0,-1,0}}]

局部空间(Local Space，或者称为物体空间(Object Space))
世界空间(World Space)
观察空间(View Space，或者称为视觉空间(Eye Space))
裁剪空间(Clip Space)
屏幕空间(Screen Space)

局部坐标是对象相对于局部原点的坐标，也是物体起始的坐标。
下一步是将局部坐标变换为世界空间坐标，世界空间坐标是处于一个更大的空间范围的。这些坐标相对于世界的全局原点，它们会和其它物体一起相对于世界的原点进行摆放。
接下来我们将世界坐标变换为观察空间坐标，使得每个坐标都是从摄像机或者说观察者的角度进行观察的。
坐标到达观察空间之后，我们需要将其投影到裁剪坐标。裁剪坐标会被处理至-1.0到1.0的范围内，并判断哪些顶点将会出现在屏幕上。
最后，我们将裁剪坐标变换为屏幕坐标，我们将使用一个叫做视口变换(Viewport Transform)的过程。视口变换将位于-1.0到1.0范围的坐标变换到由glViewport函数所定义的坐标范围内。最后变换出来的坐标将会送到光栅器，将其转化为片段。

NDC = -1 -- 1
VBO = Vertex Buffer Object
MVP（‌模型-视图-投影）‌
Projection = 投影
glm::vec3 = {x:0,y:0,z:0}

向量(x, y, z, w)。
若w==1，则向量(x, y, z, 1)为空间中的点。
若w==0，则向量(x, y, z, 0)为方向。

oa = [4,0]
ab = [0,3]
ob = oa+ab [4,3]
向量 点乘 (10,0,0,0) · (1,1,1,1) = 10 * 1 + 0*1 + 0*1 + 0*1 = 10
向量 叉乘 (10,1,2) x (5,6,7) =  1*7  - 2*6  = x   10*7 - 2*5 = y   10*6 - 1*5 =z  ==== x2 + y2 + z2
平移矩阵 [
    1,0,0,x,
    0,1,0,y,
    0,0,1,z,
    0,0,0,1
]
求解: x轴移动10位
[
    1,0,0,x+10,
    0,1,0,y,
    0,0,1,z,
    0,0,0,1
]
缩放矩阵 [
    x,0,0,0,
    0,y,0,0,
    0,0,z,0,
    0,0,0,1
]
矩阵的乘法是 行乘以列 结果放到一个新矩阵里行不变
[a,b]  * [e,f]  =  [a*e + b*g , a*f + b*h]
[c,d]    [g,h]

矩阵乘以向量 概念等于 矩阵加上向量


<div>
    好的，让我们用一个简单的例子来说明矩阵乘向量的计算过程。

    假设我们有一个矩阵 \( A \) 和一个向量 \( \vec{v} \) 如下：

    \[ A = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} \]
    \[ \vec{v} = \begin{bmatrix} 5 \\ 6 \end{bmatrix} \]

    矩阵 \( A \) 是一个 2x2 矩阵，向量 \( \vec{v} \) 是一个 2x1 列向量。矩阵乘向量的结果也是一个 2x1 的列向量。

    计算过程如下：

    1. 首先计算结果向量的第一个元素，即矩阵的第一行与向量的对应元素相乘后求和：
    \[ c_1 = (1 \times 5) + (2 \times 6) = 5 + 12 = 17 \]

    2. 然后计算结果向量的第二个元素，即矩阵的第二行与向量的对应元素相乘后求和：
    \[ c_2 = (3 \times 5) + (4 \times 6) = 15 + 24 = 39 \]

    所以，矩阵 \( A \) 乘以向量 \( \vec{v} \) 的结果是：
    \[ A \vec{v} = \begin{bmatrix} 17 \\ 39 \end{bmatrix} \]

    这就是矩阵乘向量的计算过程。希望这个例子能帮助你更好地理解。如果你有具体的矩阵和向量需要计算，可以提供给我，我可以帮你计算结果。


</div>
</body>
</html>